package com.cms.entity;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.toolkit.SqlRunner;
import com.cms.domain.Config;
import com.cms.entity.base.BaseContent;
import com.cms.enums.ContentStatus;
import com.cms.utils.SystemUtils;
import lombok.EqualsAndHashCode;
import org.apache.commons.lang.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.util.*;
import java.util.stream.Collectors;

/**
 * Entity - 内容
 * 
 * 
 * 
 */
@SuppressWarnings("serial")
@EqualsAndHashCode(callSuper = false)
@TableName("cms_content")
public class Content extends BaseContent {


    /**
     * 上一篇内容
     */
	@TableField(exist=false)
    @JSONField(serialize=false)  
    private Content lastContent;
    
    /**
     * 下一篇内容
     */
	@TableField(exist=false)
    @JSONField(serialize=false)  
    private Content nextContent;
    
    /**
     * 分类
     */
	@TableField(exist=false)
    @JSONField(serialize=false)  
    private Category category;

	/**
	 * 标签
	 */
	@TableField(exist=false)
	@JSONField(serialize=false)
	private List<Tag> tags;
    
    

	
	/**
	 * 获取分类
	 * @return 分类
	 */
	public Category getCategory(){
	    if(category == null){
			Map<String,Object> map = SqlRunner.db().selectOne("select * from cms_category where id={0}",getCategoryId());
			category = JSON.parseObject(JSON.toJSONString(map), Category.class);
		}
		return category;
	}

	/**
	 * 获取文本内容
	 * 
	 * @return 文本内容
	 */
	public String getText() {
		if (StringUtils.isEmpty(getIntroduction())) {
			return StringUtils.EMPTY;
		}
		return Jsoup.parse(getIntroduction()).text();
	}
	
   /**
     * 获取第一张图片
     * 
     * @return 第一张图片
     */
    public String getFirstImage(){
        Elements elements = Jsoup.parse(getIntroduction()).getElementsByTag("img");
        if(elements!=null && elements.size()>0){
            Element element = elements.get(0);
            return element.attr("src");
        }
        return null;
    }
    

	/**
	 * 获取上一篇内容
	 * 
	 * @return 上一篇内容
	 */
	public Content getLastContent(){
	    if(lastContent == null){
	    	Map<String,Object> map = SqlRunner.db().selectOne("select * from cms_content where id < {0} and categoryId={1} and status={2} order by id desc limit 1",getId(),getCategoryId(), ContentStatus.NORMAL.ordinal());
			lastContent = JSON.parseObject(JSON.toJSONString(map), Content.class);
	    }
		return lastContent;
	}
	
	/**
	 * 获取下一篇内容
	 * 
	 * @return 下一篇内容
	 */
	public Content getNextContent(){
	    if(nextContent == null){
			Map<String,Object> map = SqlRunner.db().selectOne("select * from cms_content where id > {0} and categoryId={1} and status={2} order by id asc limit 1",getId(),getCategoryId(), ContentStatus.NORMAL.ordinal());
			nextContent = JSON.parseObject(JSON.toJSONString(map), Content.class);
	    }
		return nextContent;
	}
	
	/**
	 * 获取属性
	 * 
	  @param name
	 * 			名称
	 * @return 属性
	 */
	public String getAttribute(String name){
		JSONObject jsonObject = JSONObject.parseObject(getModelFieldValue());
		return jsonObject.getString(name);
	}
	
   /**
     * 获取属性
     * 
      @param name
     *          名称
     * @return 属性
     */
    public List<String> getAttributes(String name){
        JSONObject jsonObject = JSONObject.parseObject(getModelFieldValue());
        JSONArray jsonArray = jsonObject.getJSONArray(name);
        if(jsonArray == null){
            return new ArrayList<>();
        }
        return JSONArray.parseArray(jsonArray.toJSONString(),String.class);
    }
    
    /**
     * 获取块数据
     * 
     * @return 块数据
     */
    public List<String> getChunkValues(){
    	if(StringUtils.isNotBlank(getChunkValue())){
			return JSONArray.parseArray(getChunkValue(), String.class);
		}
    	return new ArrayList<>();
    }

	/**
	 * 获取轮播多图
	 *
	 * @return
	 */
	public List<String> getPics(){
		if(StringUtils.isNotBlank(getPicValue())){
			return JSONArray.parseArray(getPicValue(), String.class);
		}
		return new ArrayList<>();
	}

	/**
	 * 获取标签
	 *
	 * @return
	 */
	public List<Tag> getTags(){
		String tagIdValue = getTagIdValue();
		if(StringUtils.isNotBlank(tagIdValue)){
			if(tags == null){
				String tagIdsSql = StringUtils.substring(tagIdValue,1,tagIdValue.length()-1);
				List<Map<String,Object>> maps = SqlRunner.db().selectList("select * from cms_tag where id in ("+tagIdsSql+") order by field(id,"+tagIdsSql+")");
				return maps.stream().map(i->JSON.parseObject(JSON.toJSONString(i), Tag.class)).collect(Collectors.toList());
			}
			return tags;
		}
		return new ArrayList<>();
	}

	/**
	 * 获取路径
	 *
	 * @return 路径
	 */
	public String getPath() {
		if(StringUtils.isNotBlank(getOutlink())){
			return getOutlink();
		}
		Config config = SystemUtils.getConfig();
		if(config.getSiteModel()==Config.SiteModel.DYNAMIC.ordinal()){
			return getDynamicPath();
		}
		return getHtmlPath();
	}

	/**
	 * 获取动态路径
	 *
	 * @return 动态路径
	 */
	public String getDynamicPath(){
		Map<String,Object> map = SqlRunner.db().selectOne("select * from cms_site where id={0}",getSiteId());
		Site site = JSON.parseObject(JSON.toJSONString(map), Site.class);
		String siteUrl = site.getUrl();
		String categoryCat = getCategory().getCat();
		return siteUrl+"/"+categoryCat+"/"+getId();
	}

	/**
	 * 获取静态路径
	 *
	 * @return 静态路径
	 */
	public String getHtmlPath() {
		Map<String,Object> map = SqlRunner.db().selectOne("select * from cms_site where id={0}",getSiteId());
		Site site = JSON.parseObject(JSON.toJSONString(map), Site.class);
		String siteUrl = site.getUrl();
		String categoryCat = getCategory().getCat();
		return siteUrl+"/"+categoryCat+"/"+getId()+".html";
	}

	/**
	 * 获取pc模板路径
	 *
	 * @return 模板路径
	 */
	public String getPcTemplatePath() {
		Map<String,Object> map = SqlRunner.db().selectOne("select * from cms_site where id={0}",getSiteId());
		Site site = JSON.parseObject(JSON.toJSONString(map), Site.class);
		if(StringUtils.isBlank(site.getPcTemplate()) || StringUtils.isBlank(getCategory().getDetailTemplate())){
			return null;
		}
		return "templates/"+site.getPcTemplate()+"/"+getCategory().getDetailTemplate();
	}

	/**
	 * 获取mobile模板路径
	 *
	 * @return 模板路径
	 */
	public String getMobileTemplatePath() {
		Map<String,Object> map = SqlRunner.db().selectOne("select * from cms_site where id={0}",getSiteId());
		Site site = JSON.parseObject(JSON.toJSONString(map), Site.class);
		if(StringUtils.isBlank(site.getMobileTemplate()) || StringUtils.isBlank(getCategory().getDetailTemplate())){
			return null;
		}
		return "templates/"+site.getMobileTemplate()+"/"+getCategory().getDetailTemplate();
	}
}
